export function setStorage(key, value, hours) {

    // 设置过期原则 Hours以小时为单位
    if (!value) {
        uni.removeStorageSync(key);
    } else {
        let Hours = hours || 2; // 默认保留2小时
        let exp = new Date().getTime() + Hours * 60 * 60 * 1000;
        uni.setStorageSync(key, JSON.stringify({
            expires: exp,
            value: value
        }));
    }
};

//读取localStorage
export function getStorage(name) {
    let o = uni.getStorageSync(name);
    if (!o || o.indexOf('expires') < 0 || JSON.parse(o).expires < Date.now()) {
        return false
    } else {
        return JSON.parse(o).value
    }
};

/**
 *  data 需要传入的去除null值的对象或者值
 *  defaultStr 将null值转为该字符串, 不传默认为 空字符串 ''
 */
export function removeNull(data, defaultStr = '') {
    // 普通数据类型
    if (typeof data != 'object' || data == null) {
        if ((data == null || data == 'null')) {
            return defaultStr;
        } else {
            return data;
        }
    }
    // 引用数据类型
    for (const v in data) {
        if (data[v] == null || data[v] == 'null') {
            data[v] = defaultStr;
        }
        if (typeof data[v] == 'object') {
            removeNull(data[v])
        }
    }
}

/**
 * 比对两个实体是否相等
 * compareEntity({
    origin: { a:1,b:2 },
    target: { a:3 },
    sucess: function (updata) {
        console.log(updata);
    },
    error: function () {
        console.log("内容未变更,无法修改");
    }})
 * @param {Object} opts
 */
export function compareEntity(opts) {

    let result = {};
    opts.target = opts.target || {};
    opts.origin = opts.origin || {};
    let props1 = Object.keys(opts.target);
    let props2 = Object.keys(opts.origin);
    for (let i = 0, max = props1.length; i < max; i++) {
        let propName = props1[i];
        if (opts.target[propName] != opts.origin[propName]) {
            // opts.sucess && opts.sucess(result);
            result[propName] = opts.origin[propName];
            console.log(result);
        }
    }
    // opts.error && opts.error();
    if (Object.keys(result).length > 0) {
        opts.sucess && opts.sucess(result);
    } else {
        opts.error && opts.error();
    }
}
// 判断两个对象是否相等
export function isEqual(objA, objB) {
    // 相等
    if(objA === objB) return objA !== 0 || 1/objA === 1/objB;
    // 空判断
    if(objA == null || objB == null) return objA === objB;
    // 类型判断
    if(Object.prototype.toString.call(objA) !== Object.prototype.toString.call(objB)) return false;

    switch(Object.prototype.toString.call(objA)){
        case '[object RegExp]':
        case '[object String]':
            // 字符串转换比较
            return '' + objA ==='' + objB;
        case '[object Number]':
            // 数字转换比较,判断是否为NaN
            if(+objA !== +objA){
                return +objB !== +objB;
            }

            return +objA === 0?1/ +objA === 1/objB : +objA === +objB;
        case '[object Date]':
        case '[object Boolean]':
            return +objA === +objB;
        case '[object Array]':
            // 判断数组
            for(let i = 0; i < objA.length; i++){
                if (!isEqual(objA[i],objB[i])) return false;
            }
            return true;
        case '[object Object]':
            // 判断对象
            let keys = Object.keys(objA);
            for(let i = 0; i < keys.length; i++){
                if (!isEqual(objA[keys[i]],objB[keys[i]])) return false;
            }

            keys = Object.keys(objB);
            for(let i = 0; i < keys.length; i++){
                if (!isEqual(objA[keys[i]],objB[keys[i]])) return false;
            }

            return true;
        default :
            return false;
    }
}

/**
 * 打开小程序公共方法
 */
export function commonOpenApp(tempUrl, appId, startPageUrl) {
    sys.mirror.isUpdateAvailable({
        appId: appId,
        callback: function(result) {
            //10为检测更新中  12需要更新
            if (result.status === 10 || result.status === 12) {
                window.app.widget.marketDetail({
                    params: {
                        appId: appId
                    }
                })
            } else {
                window.app.communication.canOpenURL({
                    url: tempUrl,
                    callback: function(res) {
                        if (res.status === 1) {
                            window.app.communication.openURL({
                            // sys.widget.startWidget({
                                url: tempUrl,
                                startPageUrl: startPageUrl || '',
                            });
                        } else {
                            window.app.widget.marketDetail({
                                params: {
                                    appId: appId
                                }
                            })
                        }
                    }
                });
            }
        }
    });
}

export function wechatBrower () {
    // window.navigator.userAgent属性包含了浏览器类型、版本、操作系统类型、浏览器引擎类型等信息，这个属性可以用来判断浏览器类型
    var ua = window.navigator.userAgent.toLowerCase();
    // console.log(ua)
    // alert("ua："+ua)
    // return true;
    // 通过正则表达式匹配ua中是否含有MicroMessenger和zwwx字符串
    // ua.match(/MicroMessenger/i) == 'micromessenger' &&
    if(ua.match(/MicroMessenger/i) == 'micromessenger' && (ua.match(/zwwx/i) == 'zwwx' || ua.match(/wxworklocal/i) == 'wxworklocal')){
        return true;
    } else{
        window.localStorage.clear();
        window.sessionStorage.clear();
        return false;
    }
}

// 获取url参数
export function getUrlKey(name, url){
    return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(url) || [, ""])[1].replace(/\+/g, '%20')) || null
}

export default {
    setStorage,
    getStorage,
    removeNull,
    compareEntity,
    commonOpenApp,
    isEqual,
    wechatBrower,
    getUrlKey,
}
